package com.ll.custom;

/**
 * @author 刘龙
 * @version 1.0
 */
public class CustomGeneric {
    public static void main(String[] args) {
        // 输出 1-2
        new A<Integer,Integer>().test(1,2);


        // T=Double, R=String, M=Integer
        Tiger<Double, String, Integer> tiger = new Tiger<>("ll");
        // true
        tiger.setT(10.9);
        // false 类型错误
        // ll.setT("java");

        // 没有指定泛型的具体类型,T,R,M默认都是Object
        Tiger tiger2 = new Tiger("ll");
        tiger2.setT("llll");
    }
}

class A<T,R> {
    T t1;
    T t2;

    public void test(T integer1, T integer2) {
        t1 = integer1;
        t2 = integer2;
        System.out.println(t1 + "-" + t2);
    }

}


/**
 * 自定义泛型类
 * @param <T>
 * @param <R>
 * @param <M>
 */
class Tiger<T,R, M> {
    String name;
    T t;
    R r;
    M m;
    // 使用泛型数组,不能初始化
    // T[] ts = new T[8];


    public Tiger(String name) {
        this.name = name;
    }

    public Tiger(String name, T t, R r, M m) {
        this.name = name;
        this.t = t;
        this.r = r;
        this.m = m;
    }

    // 静态方法,静态属性不能使用泛型
    // 因为静态是和类相关的,在类加载时,对象还没有创建, 泛型只有在对象定义时,才知道具体类型
    // 所以, 如果静态方法和静态属性使用了泛型,JVM就无法完成初始化
    // static R r2;
    // public static void m1(M m) {}

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public T getT() {
        return t;
    }

    public void setT(T t) {
        this.t = t;
    }

    public R getR() {
        return r;
    }

    public void setR(R r) {
        this.r = r;
    }

    public M getM() {
        return m;
    }

    public void setM(M m) {
        this.m = m;
    }
}
